iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
0
自我挑戰組

打造專案管理 iOS App 系列 第 7

安能取熊掌而舍魚? 簡易工廠

  • 分享至 

  • xImage
  •  

安能取熊掌而舍魚? 簡易工廠


這是我今天要示範的畫面,我們立即開始吧!


Let’s Get Started!

我們首先先分析一下圖層的結構
背景 -> 毛玻璃 -> 其他元件

看過以下專案圖,我發現有一下物件會一直重複使用,因此我決定建立工廠模式,讓我的物件可以用簡潔的生成,以及風格一致:

  1. 背景
  2. 頭像
  3. 按鈕
  4. 毛玻璃
    我會將以上元件簡易工廠。

背景簡易工廠

首先建立一個工廠模式的class

背景的素材如下,一共有三個:

因此我建立一個enum 包覆這三個case

善用enum可以避免重複的程式碼,並且降低輸入錯誤的風險
建立switch 應對enum的情況產出圖片。

var uiImage:UIImage
            switch type{
            case .background1:
                uiImage = #imageLiteral(resourceName: "background1.png")
            case .background2:
                uiImage = #imageLiteral(resourceName: "background2.png")
            case .backgroundBlurred:
                uiImage = #imageLiteral(resourceName: "backgroundBlurred.png")
            }

這樣是一個雛形,如果可以用一個funtion包裝,我們更容易在應對的情境選擇:

class BackGroundFactory{
    enum backGroundType{
        case background1,background2,backgroundBlurred
    }
    static func makeImage(type:backGroundType)->UIImageView{
        
        let backgroundImage : UIImageView = {
            var uiImage:UIImage
            switch type{
            case .background1:
                uiImage = #imageLiteral(resourceName: "background1.png")
            case .background2:
                uiImage = #imageLiteral(resourceName: "background2.png")
            case .backgroundBlurred:
                uiImage = #imageLiteral(resourceName: "backgroundBlurred.png")
            }
            let imageView = UIImageView(image: uiImage, highlightedImage: nil)
            imageView.frame = CGRect(x: 0, y: 0, width: ScreenSize.width.value, height: ScreenSize.height.value)
            imageView.contentMode = .scaleAspectFill
            return imageView
        }()
        return backgroundImage
    }

}

頭像簡易工廠

專案總共用了三次頭像,分別大中小。

    enum  ImageType {
        case large,medium,small
    }

因應大小對應switch

var  radius = ScreenSize.width.value
        switch size {
        case .large:
            radius = radius * 0.8
        case .medium:
            radius = radius * 0.3
        case .small:
            radius = radius * 0.2
        }

然後包裝:

class UserImageFactory{
    static func makeImageView(size:ImageType,image:UIImage?)->UIImageView{
        let imageView = UIImageView()
        if let image = image {
            imageView.image = image
        }else{
            imageView.image = UIImage(systemName: "photo")
        }
        var  radius = ScreenSize.width.value
        switch size {
        case .large:
            radius = radius * 0.8
        case .medium:
            radius = radius * 0.3
        case .small:
            radius = radius * 0.2
        }
        imageView.frame = CGRect(
        x: 100,
        y: 78,
        width: radius,
        height: radius)
        imageView.layer.cornerRadius = radius * 0.5
        imageView.clipsToBounds = true
        return imageView
    }
    enum  ImageType {
        case large,medium,small
    }
}

以上範例了兩個簡易工廠模式,接下來介紹利用工廠模式可以做到的效果:

    private var backgroundImage : UIImageView = {
        return BackGroundFactory.makeImage(type: .background1)
    }()

實例化一個物件變得非常輕鬆簡單容易,當然物件的種類還可以從enum中選擇。

    private var glassView : UIVisualEffectView = {
        var glassView = GlassFactory.makeGlass()
        return glassView
    }()

實例化毛玻璃

你有沒有注意到?

實例化的方式不太一樣?沒錯,我實例化的方式是先宣告一個物件的型別,後面緊隨一個閉包,賦予這個型別初始化的屬性。
這個實例化風格在純程式碼風格非常常見。


上一篇
安能取熊掌而舍魚? Swift 如何不使用storyBoard 連接 viewController?
下一篇
安能取熊掌而舍魚? Swift 純 Code 之 view 與 controller分離
系列文
打造專案管理 iOS App 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言